package com.sky.mapper;

import com.sky.dto.DataOverViewQueryDTO;
import com.sky.dto.OrdersPageQueryDTO;
import com.sky.entity.OrderCompleteInfo;
import com.sky.entity.OrderCountInfo;
import com.sky.entity.Orders;
import com.sky.entity.Turnover;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

@Mapper
public interface OrdersMapper {
    /**
     * 保存订单信息到订单表
     * @param orders
     */
    void add(Orders orders);

    /**
     * 根据订单号查询订单
     * @param number
     * @return
     */
    Orders findByOrderNum(String number);

    /**
     * 修改订单
     * @param orders
     */
    void update(Orders orders);

    /**
     * 根据userId和状态查询订单
     * @param status
     * @param userId
     * @return
     */
    List<Orders> searchHistory(@Param("status") Integer status, @Param("userId") Long userId);

    /**
     * 根据id 查询订单
     * @param id
     * @return
     */
    Orders findById(Long id);

    /**
     * 查询订单
     * @param ordersPageQueryDTO
     * @return
     */
    List<Orders> search(OrdersPageQueryDTO ordersPageQueryDTO);

    /**
     * 根据状态查询订单数量
     * @param status
     * @return
     */
    Integer countByStatus(Integer status);

    /**
     * 根据订单状态和下单时间查询
     * @param status 订单状态
     * @param time
     * 拿订单时间和此时间比较
     *    订单时间 > 此时间 => 没到期
     *    订单时间 < 此时间 => 到期了,需要改状态
     * @return
     */
    List<Orders> findByStatusAndOrderTime(@Param("status") Integer status,
                                          @Param("time") LocalDateTime time);

    /**
     * 根据订单状态查询订单
     * @param status
     * @return
     */
    List<Orders> findByStatus(Integer status);

    /**
     * 查询日期和营业额
     * @param dataOverViewQueryDTO
     * @return
     */
    List<Turnover> getTurnover(DataOverViewQueryDTO dataOverViewQueryDTO);

    /**
     * 根据下单时间查询完成的订单数
     * @param dataOverViewQueryDTO
     * @return
     */
    List<OrderCompleteInfo> countByOrderTimeAndStatus(DataOverViewQueryDTO dataOverViewQueryDTO);

    /**
     * 查询所有订单数量
     * @return
     */
    Integer countOrders();

    /**
     * 根据送达时间查询完成状态的订单id
     * @param dataOverViewQueryDTO
     * @return
     */
    List<Long> findByStatusAndDeliveryTime(DataOverViewQueryDTO dataOverViewQueryDTO);

    /**
     * 根据日期差订单数量
     * @param dataOverViewQueryDTO
     * @return
     */
    List<OrderCountInfo> countByOrderTime(DataOverViewQueryDTO dataOverViewQueryDTO);

    /**
     * 查询所有订单信息
     * @return
     */
    List<Orders> findAll();

    /**
     * 查询今日营业额
     * @param today
     * @param status
     * @return
     */
    Double todayTurnover(@Param("today") LocalDate today,
                         @Param("status") Integer status);

    /**
     * 查询今日下单人数
     * @param today
     * @param status
     * @return
     */
    Integer countUsers(@Param("today") LocalDate today,
                       @Param("status") Integer status);

    /**
     * 根据状态查询当天订单数量
     * @param status
     * @param today
     * @return
     */
    Integer countByStatusToday(@Param("status") Integer status,
                               @Param("today") LocalDate today);
}
